package com.sam.redis.test;

import redis.clients.jedis.Jedis;

import com.sam.redis.pool.JedisPoolUtil;
import com.sam.redis.pool.JedisPoolUtil.RedisConfig;

public class Connection {

	/**
	 * @功能说明:
	 * @param args
	 * @throws InterruptedException
	 * @返回类型:void
	 * @方法名称:main
	 * @类名称:Connection
	 * @文件名称:Connection.java
	 * @所属包名:com.sam.redis
	 * @项目名称:redis
	 * @创建时间:2017-8-3 上午10:17:09
	 * @作者:SAM QZL
	 * @版本:1.0
	 */
	public static void main(String[] args) throws InterruptedException {

		Jedis jedis = JedisPoolUtil.getInstance().getJedis(
				RedisConfig.REDIS_CONFIG_DEFAULT);
		/** 字符串操作 **/

		/** 基础字符串写入 **/
		jedis.set("userName", "sam");

		jedis.set("key1", "a1");
		jedis.set("key2", "a2");
		jedis.set("key3", "a3");
		jedis.set("key4", "a4");
		jedis.set("key5", "a5");
        /**------------------------键操作----------------------------**/
		// 删除键
		System.out.println(jedis.del("userName"));

		// 删除多个键
		System.out.println(jedis.del("userName", "a", "n"));

		// 序列化给定 key ，并返回被序列化的值。
		System.out.println(jedis.dump("key1"));

		// 检查给定 key 是否存在。
		System.out.println(jedis.exists("key1"));
		// 检查给定多个 key 是否存在。
		// System.out.println(jedis.exists("key1","userName"));

		// 为给定 key 设置过期时间2秒后过期。
		System.out.println(jedis.expire("key5", 2));
		Thread.sleep(2000);
		System.out.println(jedis.get("key5"));

		// EXPIREAT 的作用和 EXPIRE 类似，都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是
		// UNIX 时间戳(unix timestamp)。
		System.out.println(jedis.expireAt("key4",
				(System.currentTimeMillis() / 1000) + 3));
		Thread.sleep(10);
		System.out.println(jedis.get("key4"));

		// 设置 key 的过期时间以毫秒计。
		System.out.println(jedis.pexpire("key4", 1000l));

		// 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计
		System.out.println(jedis.pexpireAt("key4", System.currentTimeMillis()));

		// 查找所有符合给定模式( pattern)的 key 。
		System.out.println(jedis.keys("*"));

		// 将当前数据库的 key 移动到给定的数据库 db 当中。

		System.out.println(jedis.move("key5", 1));

		// 移除 key 的过期时间，key 将持久保持。
		System.out.println(jedis.persist("key5"));
		// 以毫秒为单位返回 key 的剩余的过期时间。

		System.out.println(jedis.pttl("key2"));

		// 以秒为单位，返回给定 key 的剩余生存时间(TTL, time to live)。
		System.out.println(jedis.ttl("key2"));
		// 从当前数据库中随机返回一个 key 。
		System.out.println(jedis.randomKey());

		// Redis Rename 命令用于修改 key 的名称 。当 OLD_KEY_NAME 和 NEW_KEY_NAME 相同，或者
		// OLD_KEY_NAME 不存在时，返回一个错误。 当 NEW_KEY_NAME 已经存在时， RENAME 命令将覆盖旧值。

		System.out.println(jedis.rename("key2", "key9"));

		// Redis Renamenx 命令用于在新的 key 不存在时修改 key 的名称 。
		System.out.println(jedis.renamenx("key9", "key1"));
		
		
		//返回 key 所储存的值的类型。
		
		System.out.println(jedis.type("runoobkey"));
		
		
		/**------------------------字符串操作----------------------------**/
		
		
		//Redis SET 命令用于设置给定 key 的值。如果 key 已经存储其他值， SET 就覆写旧值，且无视类型。
		
		
		System.out.println(jedis.set("key10", "122324234234"));
		
		
		//Redis Get 命令用于获取指定 key 的值。如果 key 不存在，返回 nil 。如果key 储存的值不是字符串类型，返回一个错误。
		
		System.out.println(jedis.get("key10"));
		
		
		//Redis Getrange 命令用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。
		System.out.println(jedis.getrange("key10", 0l, 0l));
		
		//将给定 key 的值设为 value ，并返回 key 的旧值(old value)。
		System.out.println(jedis.getSet("key10", "abc"));
		
		
		//Redis Mget 命令返回所有(一个或多个)给定 key 的值。 如果给定的 key 里面，有某个 key 不存在，那么这个 key 返回特殊值 nil 。
		System.out.println(jedis.mget("a","key1","key2"));
		
		
		//Redis Setex 命令为指定的 key 设置值及其过期时间。如果 key 已经存在， SETEX 命令将会替换旧的值。
		System.out.println(jedis.setex("key1", 2, "a2"));
		
		
		
		
		//Redis Setnx（SET if Not eXists） 命令在指定的 key 不存在时，为 key 设置指定的值
		System.out.println(jedis.setnx("key1","111"));
		
		
		//Redis Setrange 命令用指定的字符串覆盖给定 key 所储存的字符串值，覆盖的位置从偏移量 offset 开始。
		System.out.println(jedis.setrange("key1", 2, "3"));
		System.out.println(jedis.get("key1"));
		
		//返回 key 所储存的字符串值的长度。
		System.out.println(jedis.strlen("key3"));
		
		
		//Redis Mset 命令用于同时设置一个或多个 key-value 对。
		
		System.out.println(jedis.mset("key12","abc","key13","9"));
		
		System.out.println(jedis.get("key12"));
		System.out.println(jedis.get("key13"));
		
		
		
		
		
		//Redis Msetnx 命令用于所有给定 key 都不存在时，同时设置一个或多个 key-value 对。
		System.out.println(jedis.msetnx("key13","1","key14","asdasd"));
		
		
		//这个命令和 SETEX 命令相似，但它以毫秒为单位设置 key 的生存时间，而不是像 SETEX 命令那样，以秒为单位。
		System.out.println(jedis.psetex("key15",System.currentTimeMillis(),"a"));
		
		
		//Redis Incr 命令将 key 中储存的数字值增一。
//		如果 key 不存在，那么 key 的值会先被初始化为 0 ，然后再执行 INCR 操作。
//		如果值包含错误的类型，或字符串类型的值不能表示为数字，那么返回一个错误。
//		本操作的值限制在 64 位(bit)有符号数字表示之内。
		
		
		System.out.println(jedis.incr("key13"));
		
	//	System.out.println(jedis.incr("key16"));
		
//		Redis Incrby 命令将 key 中储存的数字加上指定的增量值。
//		如果 key 不存在，那么 key 的值会先被初始化为 0 ，然后再执行 INCRBY 命令。
//		如果值包含错误的类型，或字符串类型的值不能表示为数字，那么返回一个错误。
//		本操作的值限制在 64 位(bit)有符号数字表示之内。
		//System.out.println(jedis.incrBy("key16", 100l));
		
		
//		Redis Incrbyfloat 命令为 key 中所储存的值加上指定的浮点数增量值。
//		如果 key 不存在，那么 INCRBYFLOAT 会先将 key 的值设为 0 ，再执行加法操作。
		
		System.out.println(jedis.incrByFloat("key16", 0.22));
		
	
//		Redis Decr 命令将 key 中储存的数字值减一。
//		如果 key 不存在，那么 key 的值会先被初始化为 0 ，然后再执行 DECR 操作。
//		如果值包含错误的类型，或字符串类型的值不能表示为数字，那么返回一个错误。
//		本操作的值限制在 64 位(bit)有符号数字表示之内。
			
		//System.out.println(jedis.decr("key17"));
		
//		Redis Decrby 命令将 key 所储存的值减去指定的减量值。
//		如果 key 不存在，那么 key 的值会先被初始化为 0 ，然后再执行 DECRBY 操作。
//		如果值包含错误的类型，或字符串类型的值不能表示为数字，那么返回一个错误。
//		本操作的值限制在 64 位(bit)有符号数字表示之内。
		
		//System.out.println(jedis.decrBy("key17",2));
		
		
		
		
//		Redis Append 命令用于为指定的 key 追加值。
//		如果 key 已经存在并且是一个字符串， APPEND 命令将 value 追加到 key 原来的值的末尾。
//		如果 key 不存在， APPEND 就简单地将给定 key 设为 value ，就像执行 SET key value 一样。
		
		System.out.println(jedis.append("key18", "a"));
		
		System.out.println(jedis.append("key18", "b"));
		
		System.out.println(jedis.get("key18"));
		
		
	}
}
